// 引入 Pure Request
import PureRequest from "@/uni_modules/pure-request";

// 创建公共的请求实例
const instance = new PureRequest({
	// 接口基准前缀
	baseURL: import.meta.env?.VITE_API_BASE_URL || "",

	// 请求状态码配置
	// - 表示请求成功的状态码
	// - 可以是数字，数组或对象
	// - 数字
	// successStatusCode: 200, // 只有状态码为 200 时才表示请求成功
	// 数组
	// successStatusCode: [200, 201, 202], // 状态码为 200, 201, 202 中的任何一个时就表示请求成功
	// 对象
	successStatusCode: {
		// 状态码 >= 200
		start: 200,
		// 并且状态码 < 300，注意：不包含 300，时表示请求成功
		end: 300
	},

	// 数据状态码配置
	// - 表示数据状态的状态码
	// - 可以是数字，数组或对象，具体用法同上方的 `successStatusCode`
	successDataCode: 0,

	// Header
	header: {
		// 这里建议放置静态的 Header 数据
		// 动态的 Header 数据建议放到 `before` 中
		// 因为在初始化实例时，这里的值就固定了，每次请求不会变化
	},

	/**
	 * 请求前的处理函数
	 * @param {Object} config - 本次请求的配置数据
	 * @returns {Any} - 如果返回 null 则表示拦截请求，否则请求继续
	 */
	before: (config) => {
		console.log("Pure Request : 请求前的处理函数 ::", config);

		// 设置动态 Header 数据
		config.header["X-Tenant-ID"] = "admin";
		config.header["Authorization"] = "TOKEN";

		// 最后返回 config
		return config;
	},

	/**
	 * 请求后的处理函数
	 * @param {Object} res - 本次请求返回体，其中 res.config 为本次请求的配置数据
	 * @returns {Any} - 如果返回 null 则表示继续 Pure Request 后续的处理逻辑，本次请求返回该函数的返回值
	 */
	// res: 本次请求返回体
	after: async (res) => {
		console.log("Pure Request : 请求后的处理函数 ::", res);

		// statusCode - 401 -- 无效的ToKen
		// if (res.statusCode === 401) {
		//     // 1. 清除用户数据
		//     // ...

		//     // 2. Token 为空 || Refresh Token 为空 || 当前请求就是刷新 Token 的请求
		//     if (!实际的Token值 || !实际的RefreshToken值 || 实际的更新Token的状态) {
		//         // 1. 清除Tokens
		//         // 1.1. 清除Access Token
		//         // 1.2. 清除Refresh Token
		//         // ...

		//         // 2. 清除重试请求的队列
		//         // ...

		//         // 3. 跳转到登录页面或弹窗提示
		//         // 3.1. 避免重复跳转或重复弹窗
		//         if (!是否已跳转或已弹窗的Flag) {
		//             // 标记为已跳转或已弹窗
		//             是否已跳转或已弹窗的Flag = true;

		//             // 跳转到登录页面
		//             // 注意：建议在进入登录页面时更新 `是否已跳转或已弹窗的Flag` 为 `true`，离开登录页面时更新为 `false`
		//             // ...
		//         }

		//         // 返回 Promise 失败状态
		//         return Promise.reject(res);
		//     }

		//     // 3. 若正在刷新 Token，将当前请求加入队列（返回Promise等待重试）
		//     if (是否正在更新Token的Flag) {
		//         return new Promise((resolve, reject) => {
		//             重试请求队列.push({
		//                 config: res?.config,
		//                 resolve,
		//                 reject
		//             });
		//         });
		//     }

		//     // 4. 更新 Token 刷新状态
		//     是否正在更新Token的Flag = true;

		//     // 5. 刷新 Token
		//     let 刷新结果 = false;
		//     await 刷新Token的接口方法({
		//         data: {
		//             refresh_token: 刷新Token的值
		//         }
		//     }).then(resp => {
		//         // 刷新成功
		//         刷新结果 = true;

		//         // 更新 Token
		//         // uni.setStorageSync('accessToken', resp?.data?.access_token);

		//         // 批量重试队列中的所有请求
		//         重试请求队列?.forEach(item => {
		//             item.resolve(instance.request(item.config));
		//         });
		//     }).catch(error => {
		//         // 刷新失败
		//         刷新结果 = false;

		//         // 刷新 Token 失败（如 Refresh Token 过期），需跳转登录，清空队列
		//         // 通知所有队列请求 “刷新失败”
		//         重试请求队列?.forEach(item => {
		//             item.reject(error);
		//         });

		//         // 清除Tokens
		//         // - 清除Access Token
		//         // - 清除Refresh Token
		//         // ...

		//         // 跳转到登录页面
		//         // ...
		//     }).finally(() => {
		//         // 无论刷新成功/失败，都重置状态（解锁 + 清空队列）
		//         是否正在更新Token的Flag = false;
		//         重试请求队列 = [];
		//     });

		//     // 刷新成功重试本次请求
		//     if (刷新结果) return instance.request(res.config);
		//     // 否则，本次请求直接返回失败
		//     return Promise.reject(res);
		// }

		// 返回 null 表示让 Pure-Request 继续处理
		return null;
	}
});
export default instance;
